import { _decorator, Component, Node, Label } from 'cc';
const { ccclass, property } = _decorator;

/**
 * 游戏管理器
 * 负责管理游戏状态、分数计算和游戏结束逻辑
 */
@ccclass('GameManager')
export class GameManager extends Component {
    // 分数显示标签引用
    @property(Label)
    private scoreLabel: Label = null;
    
    // 游戏结束标签引用
    @property(Label)
    private gameOverLabel: Label = null;
    
    // 最高分标签引用（可选）
    @property(Label)
    private highScoreLabel: Label = null;
    
    // 当前分数
    private _score: number = 0;
    
    // 最高分
    private _highScore: number = 0;
    
    // 游戏是否结束
    private _isGameOver: boolean = false;
    
    /**
     * 组件加载时调用
     * 初始化游戏状态
     */
    onLoad() {
        this.resetGame();
        this.loadHighScore();
    }
    
    /**
     * 重置游戏
     * 清空分数，隐藏游戏结束提示
     */
    resetGame() {
        this._score = 0;
        this._isGameOver = false;
        this.updateScoreLabel();
        
        // 隐藏游戏结束标签
        if (this.gameOverLabel) {
            this.gameOverLabel.node.active = false;
        }
    }
    
    /**
     * 更新分数显示
     */
    updateScoreLabel() {
        if (this.scoreLabel) {
            this.scoreLabel.string = `得分: ${this._score}`;
        }
    }
    
    /**
     * 更新最高分显示
     */
    updateHighScoreLabel() {
        if (this.highScoreLabel) {
            this.highScoreLabel.string = `最高分: ${this._highScore}`;
        }
    }
    
    /**
     * 增加分数
     * 根据消除的行数计算得分
     * @param lines 消除的行数
     */
    addScore(lines: number) {
        // 根据消除的行数计算分数
        switch(lines) {
            case 1: 
                this._score += 100; // 消除1行得100分
                break;
            case 2: 
                this._score += 300; // 消除2行得300分
                break;
            case 3: 
                this._score += 500; // 消除3行得500分
                break;
            case 4: 
                this._score += 800; // 消除4行得800分
                break;
        }
        
        this.updateScoreLabel();
        this.checkAndUpdateHighScore();
    }
    
    /**
     * 游戏结束
     * 显示游戏结束提示，更新最高分
     */
    gameOver() {
        this._isGameOver = true;
        
        // 显示游戏结束标签
        if (this.gameOverLabel) {
            this.gameOverLabel.node.active = true;
        }
        
        // 检查并更新最高分
        this.checkAndUpdateHighScore();
        this.saveHighScore();
    }
    
    /**
     * 重新开始游戏
     * 重置游戏状态，开始新游戏
     */
    restartGame() {
        this.resetGame();
        
        // 这里可以添加重置其他游戏组件的逻辑
        // 例如重置BlockManager
    }
    
    /**
     * 检查并更新最高分
     */
    checkAndUpdateHighScore() {
        if (this._score > this._highScore) {
            this._highScore = this._score;
            this.updateHighScoreLabel();
        }
    }
    
    /**
     * 加载最高分
     * 从本地存储读取最高分
     */
    loadHighScore() {
        // 这里使用简单的方式存储最高分
        // 实际项目中可以使用cc.sys.localStorage
        const savedHighScore = cc.sys.localStorage.getItem('tetris_high_score');
        if (savedHighScore) {
            this._highScore = parseInt(savedHighScore);
            this.updateHighScoreLabel();
        }
    }
    
    /**
     * 保存最高分
     * 将最高分保存到本地存储
     */
    saveHighScore() {
        cc.sys.localStorage.setItem('tetris_high_score', this._highScore.toString());
    }
    
    /**
     * 获取游戏是否结束状态
     */
    get isGameOver(): boolean {
        return this._isGameOver;
    }
    
    /**
     * 获取当前分数
     */
    get score(): number {
        return this._score;
    }
    
    /**
     * 获取最高分
     */
    get highScore(): number {
        return this._highScore;
    }
}